package AnalizadorSintactico;

import java.util.ArrayList;

import javax.swing.tree.DefaultMutableTreeNode;

import AnalizadorLexico.Lexema;
import AnalizadorSemantico.SimboloCampo;
import AnalizadorSemantico.SimboloMetodo;

public class Expresion {

	private ExpresionAritmetica expA;
	private ExpresionRelacional expR;
	private ExpresionLogica expL;
	private LlamadaAMetodo llamada;
	private IncrementoODecremento iod;
	private Lexema idOCadena;
	private Instanciacion ins;
	private ArrayList<SimboloCampo> tablaCampos;
	private String ambito;
	private ArrayList<SimboloMetodo> tablaMetodos;

	public void setAmbito(String ambito) {
		this.ambito = ambito;
	}

	public Expresion(Lexema idOcadena) {
		this.idOCadena = idOcadena;
	}

	public Expresion(LlamadaAMetodo llamada) {
		this.llamada = llamada;
	}

	public Expresion(ExpresionAritmetica expA2) {
		this.expA = expA2;
	}

	public Expresion(Instanciacion ins) {
		this.ins = ins;
	}

	@Override
	public String toString() {
		String exp = "";
		if (expA != null) {
			exp = expA.toString();
		}
		if (expR != null) {
			exp = expR.toString();
		}
		if (expL != null) {
			exp = expL.toString();
		}
		if (llamada != null) {
			exp = llamada.toString();
		}
		if (iod != null) {
			exp = iod.toString();
		}
		if (idOCadena != null) {
			exp = idOCadena.getLexema();
		}
		if (ins != null) {
			exp = ins.toString();
		}
		return exp;
	}

	public DefaultMutableTreeNode getSubArbol() {
		DefaultMutableTreeNode nodo = new DefaultMutableTreeNode("Expresion: "
				+ evaluarTipoResultante());
		if (expA != null) {
			nodo.add(expA.getSubArbol());
		}
		if (expR != null) {
		}
		if (expL != null) {
		}
		if (llamada != null) {
			DefaultMutableTreeNode llamNod = new DefaultMutableTreeNode(
					"llamada");
		}
		if (iod != null) {
			DefaultMutableTreeNode iodNod = new DefaultMutableTreeNode(
					"incremento o decremento");
		}
		if (idOCadena != null) {
			DefaultMutableTreeNode idocNod = new DefaultMutableTreeNode(
					idOCadena.getLexema());
		}
		if (ins != null) {
			DefaultMutableTreeNode insNod = new DefaultMutableTreeNode(
					"instanciacion");
		}
		return nodo;
	}

	public String evaluarTipoResultante() {
		String tipoResultante = "";
		if (expA != null) {
			expA.setAmbito(ambito);
			expA.setTablaCampos(tablaCampos);
			expA.setTablaMetodos(tablaMetodos);
			tipoResultante = expA.evaluarTipoResultante();
		}
		if (expR != null) {
			// evaluar
		}
		if (expL != null) {
			// evaluar
		}
		if (llamada != null) {
			tipoResultante = llamada.evaluarTipoResultante();
		}
		if (iod != null) {
			// evaluar
		}
		if (idOCadena != null) {
			// evaluar
		}
		if (ins != null) {
			// evaluar
		}
		return tipoResultante;
	}

	public void setTablaCampos(ArrayList<SimboloCampo> tablaCampos) {
		this.tablaCampos = tablaCampos;
	}

	public void setTablaMetodos(ArrayList<SimboloMetodo> tablaMetodos) {
		this.tablaMetodos = tablaMetodos;

	}

}
